package PersonStu.siqi;

import java.util.LinkedList;

/**
 * @Author：DijaH
 * @Date：2023/1/21 4:55 下午
 * @Version：1.0.0
 * @Description： 给定一个字符串，字符串中可能包含（），+-* /。要求计算最后计算的结果
 * 例如：String exp = 48*((70-65)-43)+8*1 = -1816
 *
 * 思路：
 * */
public class code04_ExpressionCompute {

    public static int getValue (String exp){
        return value(exp.replaceAll(" " ,"").toCharArray(),0)[0];
    }

    // 0) 负责的这一段的结果是多少
    // 1) 负责的这一段计算到了哪个位置
    private static int[] value(char[] str, int i) {
        LinkedList<String> que = new LinkedList<>();
        int cur = 0;
        //从 i == 0 开始，
        int [] bra = null;
        while (i < str.length && str[i] != ')'){
            //如果当前位置是数字
            if(str[i] >= '0' && str[i] <= '9'){
                cur = cur * 10 + str[i++] - '0';
            }else if(str[i] != '('){
                //如果遇到了运算符,做计算
                addNum(que,cur);
                //入队
                que.addLast(String.valueOf(str[i++]));
                cur = 0;
            }else {
                //如果遇到了左括号
                bra =value(str,i + 1);
                cur = bra[0];
                i = bra[1] + 1;
            }
        }
        addNum(que,cur);
        return new int[] {getNum(que),i};
    }

    private static int getNum(LinkedList<String> que) {
        int res = 0;
        boolean add = true;
        String cur = null;
        int num = 0;
        while (!que.isEmpty()) {
            cur = que.pollFirst();
            if (cur.equals("+")) {
                add = true;
            } else if (cur.equals("-")) {
                add = false;
            } else {
                num = Integer.valueOf(cur);
                res += add ? num : (-num);
            }
        }
        return res;
    }

    private static void addNum(LinkedList<String> que, int num) {
        if(!que.isEmpty()){
            int cur = 0;
            String top = que.pollLast();
            if(top.equals("+") || top.equals("-")){
                que.addLast(top);
            }else{
                cur = Integer.valueOf(que.pollLast());
                num = top.equals("*") ? (cur * num) : (cur / num);
            }
        }
        que.addLast(String.valueOf(num));
    }

    public static void main(String[] args) {
        String exp = "(1+(4+5+2)-3)+(6+8)";
        System.out.println(getValue(exp));
    }
}
